#!/bin/bash

# IO应急处理脚本
# 用于在系统出现IO高负载时快速恢复系统响应

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 检查是否以root权限运行
if [[ $EUID -ne 0 ]]; then
   echo -e "${RED}此脚本需要root权限运行${NC}"
   echo "请使用 sudo $0 重新运行"
   exit 1
fi

echo -e "${RED}===== IO应急处理脚本 =====${NC}"
echo "此脚本用于在系统出现IO高负载时快速恢复系统响应"
echo -e "${YELLOW}警告: 此脚本可能会中断正在进行的IO操作${NC}"
echo

# 显示当前IO状态
echo -e "${BLUE}当前IO状态:${NC}"
iostat -xd 1 1 | grep -v "^$" | grep -A 1 "^Device" | tail -n +2
echo

# 显示等待IO的进程
echo -e "${BLUE}等待IO的进程:${NC}"
ps aux | awk '$8 ~ /D/ {print $0}' | head -10
echo

# 确认是否继续
read -p "是否继续执行应急处理? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "操作已取消"
    exit 0
fi

# 应急处理步骤
echo -e "${BLUE}[1/5] 同步文件系统缓存...${NC}"
sync
echo -e "${GREEN}✓ 文件系统缓存已同步${NC}"

echo -e "${BLUE}[2/5] 释放页面缓存...${NC}"
echo 1 > /proc/sys/vm/drop_caches
echo -e "${GREEN}✓ 页面缓存已释放${NC}"

echo -e "${BLUE}[3/5] 临时调整IO参数...${NC}"
echo 1 > /proc/sys/vm/dirty_writeback_centisecs
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 2 > /proc/sys/vm/dirty_ratio
echo -e "${GREEN}✓ IO参数已临时调整${NC}"

echo -e "${BLUE}[4/5] 终止高IO进程...${NC}"
# 获取IO使用率最高的进程
high_io_pids=$(iotop -b -n 1 -o | head -n 10 | awk '{print $1}' | grep -v "PID" | grep -v "^$")

if [ -n "$high_io_pids" ]; then
    for pid in $high_io_pids; do
        if [ "$pid" -ne 1 ] && [ "$pid" -ne $$ ]; then
            process_info=$(ps -p $pid -o pid,ppid,user,cmd | tail -n 1)
            echo "发现高IO进程: $process_info"
            
            # 确认是否终止进程
            read -p "是否终止此进程? (y/n): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                echo "正在终止进程 $pid..."
                kill -15 $pid
                sleep 1
                # 检查进程是否仍在运行
                if ps -p $pid > /dev/null; then
                    echo "进程未响应SIGTERM，尝试强制终止..."
                    kill -9 $pid
                    if ps -p $pid > /dev/null; then
                        echo -e "${RED}无法终止进程 $pid${NC}"
                    else
                        echo -e "${GREEN}进程 $pid 已强制终止${NC}"
                    fi
                else
                    echo -e "${GREEN}进程 $pid 已正常终止${NC}"
                fi
            fi
        fi
    done
else
    echo "未发现高IO进程"
fi

echo -e "${BLUE}[5/5] 恢复正常IO参数...${NC}"
echo 100 > /proc/sys/vm/dirty_writeback_centisecs
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 10 > /proc/sys/vm/dirty_ratio
echo -e "${GREEN}✓ IO参数已恢复${NC}"

# 总结
echo
echo -e "${GREEN}===== IO应急处理完成 =====${NC}"
echo "已执行的操作:"
echo "1. 同步文件系统缓存"
echo "2. 释放页面缓存"
echo "3. 临时调整IO参数"
echo "4. 处理高IO进程"
echo "5. 恢复正常IO参数"
echo
echo -e "${YELLOW}注意: 系统应该已经恢复正常响应${NC}"
echo "如果问题仍然存在，建议重启系统"
echo
echo -e "${BLUE}建议后续操作:${NC}"
echo "1. 运行IO监控工具检查系统状态: ./io-monitor.sh"
echo "2. 应用IO优化配置: sudo ./io-optimizer.sh"